[やってみた] Jetson Nano でDeepComposerのWorkshop Lab2(GANカスタムモデルの学習&推論)をやってみた。#AIM223 #reinvent 2019
明けましておめでとうございます。AWS事業本部の梶原@福岡オフィスです。早速ですが、昨年のre:Inventで参加したワークショップ「AWS DeepComposer: Get started with generative AI」のDeepComposerのWorkshop Lab2(カスタムモデルの学習&推論部分)をJetson Nanoで学習&推論をやってみたので手順等、共有します。
DeepComopser自体はまだGAされておりませんが、Workshopで使用されたリポジトリはGithubにて先日公開されており、ワークショップではSageMakerを使用しましたが、カスタムモデルの実習部分(Lab2)はSageMakerには大きく依存していないように見えたので、手元にあるJetson Nanoで実施してみました。基本的にはローカルのPC(GPU付を推奨)でも今回ご紹介する学習、推論は実施可能だと思います。
先にお断りしておきますが、Jetson Nanoでの学習(モデル作成)はSageMakerと比較するとやっぱり時間がかかります。推論は結構実用範囲(2~3秒)できますので、現実的な解としては、学習(モデルの作成)はSageMakerで実施することをお勧めします。ネットワーク環境が不安定とか、エッジで全部やりたい(Jetsonでやりたい)という強い動機を持たれてる方のご参考になればと思います。
必要なもの
- Jetson Nano
- 32G以上のSD(スワップファイルを8GB確保します)
- できれば、電源はAC供給、Fan付、パフォーマンスモード
- Jupyter Notebook用のWebクライアント
- WebブラウザがあればOK
- Jetson Nano単体でもできなくはないとおもうのですが、学習時にJupyter Notebook(Python)にメモリをとられてしまいバッチサイズをかなり小さくする必要がありましたので別PCからアクセスしたほうがいいかと思います。
- SciPy(依存パッケージ)のインストール失敗やエラーが出てもあきらめない強い気持ち
目次
- 機械学習環境整備
- 学習
- 推論
0. Jetson Nanoの機械学習環境整備
Workshopでは、Notebookの先頭で実施していましたが、SageMakerとJetson nanoでは環境がちがいそのままでは実施できませんので、事前に環境整備を実施します
SDカード(OS)イメージの準備
既にJetson Nanoの初期セットアップ等が終わっている場合は本項はスキップしてください
- Jetpack 4.3 [L4T 32.3.1] (SDイメージ:
nv-jetson-nano-sd-card-image-r32.3.1
)を使用して検証しています- https://developer.nvidia.com/embedded/downloads
- ダウンロードしたSDイメージをSDカードに焼いて、初期セットアップ(ネットワーク設定、sshログイン程度まで)を実施します。
- Lang : English
スワップファイルの拡張
学習時スワップファイルがかなり発生するのでスワップ領域を拡張します。 便利なスクリプトがありますのでこれを使わせてもらいます(8GB確保されます)
git clone https://github.com/JetsonHacksNano/installSwapfile cd installSwapfile ./installSwapfile.sh -s 8 free -h total used free shared buff/cache available Mem: 3.9G 550M 2.9G 19M 487M 3.2G Swap: 7.9G 0B 7.9G
機械学習環境の準備
- Tensor-flowのインストール
- https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html#install
- 基本的には上記URLのJetsonの手順に沿ってインストールを実施しました。
- 注:ワークショップで指定されているバージョンは1.14.0ですが、version 1.15.0で実施しています。
tensor flowの依存パッケージのインストール
sudo apt-get update sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev sudo apt-get install python3-pip sudo pip3 install -U pip testresources setuptools
- numpyは1.16.4を指定(DeepComposerの環境と合わせて) Jetson公式のインストール手順から変更
- numpy他のビルドが実施されるため、インストールに時間がかかります。(少しでも時間を短くしたい場合はこのタイミングで
sudo jetson_clocks
!) - enum34は pypianoroll のインストール時にエラーとなるため、Jetson公式のインストール手順から外しています。
sudo pip3 install -U numpy==1.16.4 future==0.17.1 mock==3.0.5 h5py==2.9.0 keras_preprocessing==1.0.5 keras_applications==1.0.8 gast==0.2.2 futures protobuf <略> Successfully installed future-0.17.1 futures-3.1.1 gast-0.2.2 h5py-2.9.0 keras-applications-1.0.8 keras-preprocessing-1.0.5 mock-3.0.5 numpy-1.16.4 protobuf-3.11.2
tensor flow のインストール
Jetsonには公式パッケージが用意されてますのでそちらを使用します。
- tensorflowは 1.15.0を指定(DeepComposerの環境は1.14.0) Jetson公式のインストール手順から変更しています
- ビルドが実施されるため、インストールに時間がかかります。
sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v43 tensorflow-gpu==1.15.0 <略> Successfully installed absl-py-0.9.0 astor-0.8.1 google-pasta-0.1.8 grpcio-1.26.0 markdown-3.1.1 opt-einsum-3.1.0 tensorboa rd-1.15.0 tensorflow-estimator-1.15.1 tensorflow-gpu-1.15.0+nv19.12.tf1 termcolor-1.1.0 werkzeug-0.16.0 wrapt-1.11.2
SciPy のインストール(ついでにJupyter他)
参考 https://www.scipy.org/install.html
- SciPyのビルドで
No lapack/blas resources found.
のエラーが発生したため依存する開発用ライブラリのインストールを実施しています。 - SciPyのビルドで
pybind11/pybind11.h: No such file or directory
のエラーが発生したため依存する開発用ライブラリのインストールを実施しています。(pybind11) - matplotlibのビルドで
ft2build.h: No such file or directory
のエラーが発生したためfreetypeのライブラリをインストールしています -
SciPyの手順にのっとって、jupter他のパッケージもインストールしています。
- ビルドが実施されるため、インストールに時間がかかります。
sudo apt-get install gcc gfortran python-dev libopenblas-dev liblapack-dev libfreetype6-dev cython sudo pip3 install pybind11 sudo pip3 install scipy sudo pip3 install matplotlib ipython jupyter pandas sympy nose
DeepComposerのNotebookで使用するパッケージのインストール
- DeepComposerのインストールでは
sudo pip3 install --ignore-installed moviepy
となっていますが、numpy等のバージョンアップが実施されてしまいますので。--ignore-installed
は使用していません。(元のnotebookで使用している理由は不明です)
sudo pip3 install pretty_midi sudo pip3 install pypianoroll sudo pip3 install music21 sudo pip3 install seaborn sudo pip3 install moviepy
1. 学習
Jupyter Notebookを起動します
- 起動時にオプションで外部からの接続を許可して起動します。
jupyter notebook --ip=* --no-browser [I 18:14:36.602 NotebookApp] Writing notebook server cookie secret to /home/jetson/.local/share/jupyter/runtime/notebook_cookie_secret [W 18:14:37.506 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended. [I 18:14:37.518 NotebookApp] Serving notebooks from local directory: /home/jetson [I 18:14:37.518 NotebookApp] The Jupyter Notebook is running at: [I 18:14:37.519 NotebookApp] http://jetson-nano:8888/?token=hogehoge [I 18:14:37.519 NotebookApp] or http://127.0.0.1:8888/?token=hogehoge [I 18:14:37.519 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). [C 18:14:37.535 NotebookApp] To access the notebook, open this file in a browser: file:///home/jetson/.local/share/jupyter/runtime/nbserver-22926-open.html Or copy and paste one of these URLs: http://jetson-nano:8888/?token=hogehoge or http://127.0.0.1:8888/?token=hogehoge
表示されたhttp://jetson-nano:8888/?token=hogehoge
にアクセスします。
DeepComposerのWorkshopのリポジトリをclone
SageMakerの右上のメニューからnew
->Terminal
を実施します。
(作成しているディレクトリSageMakerは任意です。コマンドを揃えたかったので)
mkdir SageMaker cd SageMaker/ git clone https://github.com/aws-samples/aws-deepcomposer-samples.git
ワークショップのLab2の実施
- Jupter Notebookから"SageMaker/aws-deepcomposer-samples/Lab 2"の
GAN.ipynb
を開き、各行を実施しています。 - SageMakerでは特に問題なく実施できますが、Jetson Nanoで実施する際は下記変更を行いました。
- カスタムモデルの学習詳細については他のブログのエントリー等で紹介されていますので割愛します。
前準備(Dependencies)
- tensorflow等の依存パッケージはインストールしてますので、コメントアウト(先頭に#)してスキップします。
# Create the environment # !conda update --all --y # !pip install tensorflow-gpu==1.14.0 # !pip install numpy==1.16.4 # !pip install pretty_midi # !pip install pypianoroll # !pip install music21 # !pip install seaborn # !pip install --ignore-installed moviepy
Load data
- メモリが確保できない旨のエラーが発生したため(OOM when allocating tensor with shape)、BATCH_SIZE = 16 に変更しています
#Number of input data samples in a batch BATCH_SIZE = 16 #Shuffle buffer size for shuffling data SHUFFLE_BUFFER_SIZE = 1000 #Preloads PREFETCH_SIZE batches so that there is no idle time between batches PREFETCH_SIZE = 4
Training
- なんどか学習するとメモリが確保できなくなってしまう状況だったので for iteration in range(iterations): の下の部分に tf.keras.backend.clear_session() を挿入してセッション開放しています。
for iteration in range(iterations): tf.keras.backend.clear_session()
また、メモリが足りない旨のメッセージがでたら別途、GCを実行してます。
import gc gc.collect()
また、上記のループが1000 回実施されると終了しますが、メモリ不足のためバッチサイズを1/4にしているため、学習の回数は4000回以上が正解だと思います。(学習のチューニングは今回の目的からはずれるため、時間短縮のため同じ1000回数にしています)
学習の終了まで2時間程度かかりますので、気長に待ちます。
ちなみに学習中はGPUを占有してしまうので、Jetson Nanoではほぼ操作はできません。そしてめちゃ熱いのでファンは必須だと思ってください
Evaluate results (結果の評価)
Generated samples during training
で、iteration を50~950で変更して、自分の耳で聞いてみてください。 回数が増えるにつれてそれっぽくなるはずです。 (残念ながらきれいにいい感じには収束してくれていないようなのでもう少しチューニングまたが必要そうです。)
2. 推論
作成したモデルでキラキラ星に伴奏をつけてみましょう。ということで、作成したモデルを使用して、伴奏を生成してみます。
latest_midi = inference_utils.generate_midi(generator, eval_dir, input_midi_file='./input_twinkle_twinkle.mid') display_utils.playmidi(latest_midi) inference_utils.show_generated_pianorolls(generator, eval_dir, input_midi_file='./input_twinkle_twinkle.mid')
率直に言うと、まだまだ学習が足りないようです。回数等を増やしてチューニングして、収束してくれるように頑張ってもらおうと思います。
まとめ
Jetson NanoでのGANの機械学習環境の構築みたいな感じになってますが、学習できるめどはついたので、チューニングしていこうかなと思っています。 Jetson Nanoでは時間はかかりますがWあたりの効率はかなり高いので機械学習に興味がある方 は購入して遊んでみてはいかがでしょうか。 (それでもGPUを使わないでPCのCPUや一世代前のGPUでの学習にくらべたらかなり速いです)
Jetson Nanoでも推論は結構実用範囲内だとおもうので、他のカスタムモデルを用いてJetson Nano用にTensor-RTを用いた推論の高速化などまでやってみると、Jetson Nanoにマイクをつけたら、おもしろいのができるんじゃないかと画策しています。
実際のところ、Jetson Nanoの機械学習環境は既存の環境(機械学習用にごちゃごちゃはいってる)だとすんなり行ったんですが、ブログ化の為、0の状態から環境を整えると年をまたいでしまいました。(環境構築時にビルドしなければ少しは時間は短縮できるとは思いますが未検証です) 数分で環境が立ち上り、手軽にスケールアップできたり、パラメータのチューニングが手軽にできる。SageMakerの良さを再確認することになりました。今年もSageMakerのお世話になりそうです。
そして、DeepComposerはGANのリファレンス実装みたいな雰囲気を感じるのでGAが待ち遠しいです。
参考リンク
- DeepComposer Workshopリポジトリ
- TensorFlow for Jetson Platform.
- SciPy
DevlopsersIO DeepComposer記事
https://dev.classmethod.jp/referencecat/deepcomposer/
おまけ
Jetsonで学習中にGPUの使用率などを確認したいときはjtop(jetson_stats)が便利です
https://github.com/rbonghi/jetson_stats
sudo -H pip install jetson-stats sudo jtop
Jetson Nanoのみで実施する場合
- chromium & Jupyterにメモリをとられ、バッチサイズをさらに小さくしないと1000回の学習は実施できませんでした。(実際にSageMaker同等のモデルに近づけたい場合は学習の回数はさらに増やす必要があるかと思います。
- chromium がエラーを吐くのでchromium-browser --no-sandbox で実施しました